package com.shihb.chapter05matchcase

/**
 * Description:模式匹配入门
 *
 * @author shihb
 * @date 2020/9/30 11:06
 */
object Demo01GettingStart {
  // 1、快速入门
  def test: Unit = {
    val oper: Any = 1
    val n1 = 20
    val n2 = 10
    var res = 0

    /**
     * match 和 case是关键字
     * 如果匹配成功运行=>后面的代码块
     * 从上到下匹配,没匹配到运行 case _ =>后的代码块
     * 只会匹配到一个不用break
     * 匹配到的类型很松散,不一定要字符串
     */
    oper match {
      case "+" => res = n1 + n2
      case "-" => res = n1 - n2
      case "/" => res = n1 / n2
      case 1 => println("匹配到" + 1)
      case _ => println("error")
    }
    println(res)
  }

  // 2、守卫
  def test2: Unit = {
    // 如果case _ 后又守卫if,
    // case _不是表示默认匹配,表示忽略匹配值
    val n1 = 20
    val n2 = 10
    for (i <- "+-3!") {
      i match {
        case '+' => println(n1 + n2)
        case '-' => println(n1 - n2)
        case _ if '3'.equals(i) => println("打印3")
        case _ => println("没匹配上")
      }
    }

  }

  // 模式中的变量，相当于赋值,一定能匹配上
  def test3: Unit = {
    val n1 = 20
    val n2 = 10
    for (i <- "+-3!") {
      // 如果类型缺点,匹配没有的类型的就会报错
      val tmp:AnyVal=i
      val res = tmp match {
        case '+' => n1 + n2
        case '-' => n1 - n2
          //这边的_代表隐藏变量名
        case _: Int => "是int"
        //匹配类型
        case char: Char => "myChar is Char:" + char
        //相当于把i 赋值也mychar,相当于无条件匹配
        case char => "myChar:" + char
        case _ => "没匹配上"
      }
      // 模式匹配的返回值就是最后执行的一行
      println(res)
    }
  }

  def main(args: Array[String]): Unit = {
    test3
  }


}
